<?php
/**
 * Подключаем класс для распарсивания XML
 */
require_once(dirname(__FILE__) . "/XMLConfigParser.php");

/**
 * RL_DocumentTypeConfig class
 *
 * @package mumak
 * @subpackage core
 */
class RL_DocumentTypeConfig
{
	
	/**
	 * Поля типа
	 *
	 * @var array
	 */
	public $fields_config = array();
	
	/**
	 * Поля, которые надо исключить из цикла наследования
	 *
	 * @var array
	 */
	public $exclude_inherited = array();
	
	/**
	 * Конструктор. Ничего не делает.
	 *
	 * @return RL_DocumentTypeConfig
	 */
	public function __construct()
	{
	}
	
	/**
	 * Распарсивает XML-ную строку-конфиг
	 *
	 * @param string $config_string
	 * @return RL_DocumentTypeConfig
	 */
	public function parseConfig( $config_string )
	{
		$parser = new RL_XMLConfigParser();
		
		$xml = $parser->parseString($config_string);
		
		if(!$xml) {
			return false;
		}
		
		// пробегаемся по всем полям
		foreach ($xml->fields as $field) {
			$_field = array();
			$fattrs = $field->attributes();
			
			$_field = $fattrs;
			
			foreach ($field->params as $param) {
				$attrs = $param->attributes();
				$_field["params"][$attrs["name"]] = (string)$param;
			}
			
			$this->fields_config[$fattrs["name"]] = $_field;
		}
		
		// если есть <exclude><field>some_name</field></exclude>, то это мы тоже запоминаем
		if(sizeof($xml->excluded) > 0) {
			foreach ($xml->excluded as $exclude) {
				$this->exclude_inherited[$exclude] = $exclude;
			}
		}
		
		return $this;
	}
	
	public function mergeWithParent ( RL_DocumentTypeConfig $parent_config )
	{
		// объединяем поля
		foreach ($parent_config->fields_config as $name => $field) {
			if(!isset($this->fields_config[$name]) && !isset($this->exclude_inherited[$name])) {
				$this->fields_config[$name] = $field;
			}
		}
		
		// объединяем исключения
		foreach ($parent_config->exclude_inherited as $name => $value) {
			if(!isset($this->exclude_inherited[$name])) {
				$this->exclude_inherited[$name] = $value;
			}
		}
	}
}
?>